package demo02;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class FileUploadClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8888);
                FileInputStream fileInputStream = new FileInputStream("file\\土墩墩.jpg")) {
            OutputStream outputStream = socket.getOutputStream();
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, len); // 客户端向服务器端发送数据
                // 数据写入完成后，write()方法不会将结束标记也一同写入，会引发服务器端接收数据时找不到结束标记的问题
            }

            /*
             *  shutdownOutput()：禁用此套接字的输出流
             *  在该语句之前的任何向输出流写入的数据都将被发送，并且后面会跟随一个TCP的正常连接终止序列（即结束标记）
             *  通过此方法，可以防止数据上传时因为没有写入结束标记，从而导致服务器端无限读取数据而卡死
             */
            socket.shutdownOutput();

            InputStream inputStream = socket.getInputStream();
            len = inputStream.read(bytes);
            System.out.println(new String(bytes, 0, len)); // 客户端接收服务器端回写的提示信息            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
